import type { Recordable } from '@vben/types';

import { message, Modal } from 'ant-design-vue';

import {
  updateAreaStatus,
  updateLocationStatus,
  updateWareHouseStatus,
  updateWareStockStatus,
} from '#/api';

/**
 *
 * @param content 提示内容
 * @param title 提示标题
 */
export function confirm(content: string, title: string) {
  return new Promise((reslove) => {
    Modal.confirm({
      content,
      onOk() {
        reslove(true);
      },
      title,
    });
  });
}

/**
 * 修改仓库设置冻结状态
 * @param row 行数据
 * @param newStatus 期望改变的状态值
 * @returns 返回false则中止改变，返回其他值（undefined、true）则允许改变
 */
export async function handleWarehouseSwitchChange(row: any, newStatus: number) {
  const status: Recordable<string> = {
    0: '解冻',
    1: '冻结',
  };
  try {
    await confirm(
      `确认要【${status[Number(newStatus)]}】${row.warehouseName} 仓库 吗？`,
      `切换状态`,
    );
    row.frozenFlag = newStatus ? 'Y' : 'N';
    updateWareHouseStatus({
      warehouseId: row.warehouseId,
      frozenFlag: row.frozenFlag,
    }).then(() => {
      // 发送请求
      message.success(
        `${row.warehouseName}状态已变更为: ${newStatus ? '冻结' : '解冻'}`,
      );
      return true;
    });
  } catch {
    return false;
  }
}

/**
 * 修改仓库库存冻结状态
 * @param row 行数据
 * @param newStatus 期望改变的状态值
 * @returns 返回false则中止改变，返回其他值（undefined、true）则允许改变
 */
export async function handleWmstockSwitchChange(row: any, newStatus: number) {
  const status: Recordable<string> = {
    0: '解冻',
    1: '冻结',
  };
  try {
    await confirm(
      `确认要【${status[Number(newStatus)]}】${row.warehouseName} 库存吗？`,
      `切换状态`,
    );
    row.frozenFlag = newStatus ? 'Y' : 'N';
    updateWareStockStatus({
      materialStockId: row.materialStockId,
      frozenFlag: row.frozenFlag,
    }).then(() => {
      // 发送请求
      message.success(
        `${row.warehouseName}状态已变更为: ${newStatus ? '冻结' : '解冻'}`,
      );
      return true;
    });
  } catch {
    return false;
  }
}

/**
 * 处理库区状态切换的异步函数
 *
 * 当库区的状态在冻结和解冻之间切换时调用此函数它负责显示确认对话框，
 * 更新库区的冻结状态，并显示操作结果的消息
 * @param row 包含库区信息的对象，用于标识库区并更新其状态
 * @param newStatus 新的状态，0代表解冻，1代表冻结
 * @returns {Promise<boolean>} 返回一个Promise，表示状态切换是否成功
 */
export async function handleLocationSwitchChange(row: any, newStatus: number) {
  const status: Recordable<string> = {
    0: '解冻',
    1: '冻结',
  };
  try {
    await confirm(
      `确认要【${status[Number(newStatus)]}】${row.locationName} 库区 吗？`,
      `切换状态`,
    );
    row.frozenFlag = newStatus ? 'Y' : 'N';
    updateLocationStatus({
      locationId: row.locationId,
      frozenFlag: row.frozenFlag,
    }).then(() => {
      // 发送请求
      message.success(
        `${row.locationName}状态已变更为: ${newStatus ? '冻结' : '解冻'}`,
      );
      return true;
    });
  } catch {
    return false;
  }
}

/**
 * 处理库位状态切换的异步函数
 *
 * 当库区的状态在冻结和解冻之间切换时调用此函数它负责显示确认对话框，
 * 更新库区的冻结状态，并显示操作结果的消息
 * @param row 包含库区信息的对象，用于标识库区并更新其状态
 * @param newStatus 新的状态，0代表解冻，1代表冻结
 * @returns {Promise<boolean>} 返回一个Promise，表示状态切换是否成功
 */
export async function handleAreaSwitchChange(row: any, newStatus: number) {
  const status: Recordable<string> = {
    0: '解冻',
    1: '冻结',
  };
  try {
    await confirm(
      `确认要【${status[Number(newStatus)]}】${row.areaName} 库位 吗？`,
      `切换状态`,
    );
    row.frozenFlag = newStatus ? 'Y' : 'N';
    updateAreaStatus({
      areaId: row.areaId,
      frozenFlag: row.frozenFlag,
    }).then(() => {
      // 发送请求
      message.success(
        `${row.areaName}状态已变更为: ${newStatus ? '冻结' : '解冻'}`,
      );
      return true;
    });
  } catch {
    return false;
  }
}
export function messageSuccess(content: string) {
  message.success({
    content,
  });
}
export function messageError(content: string) {
  message.error({
    content,
  });
}
